﻿/* 
   Copyright 2011 LUCA Studios LLC & John Evans

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

namespace LUCAStudios.Silverlight.Controls.DragDrop
{
    using System.Collections.Generic;

    /// <summary>
    /// Identifies controls which will participate as drop targets during a drag/drop operation
    /// </summary>
    public interface IDragDropTarget
    {
        /// <summary>
        /// Requires the control to return drop zones when a drag operation begins
        /// </summary>
        /// <param name="dropData">The IDragDropSource.DragDropData information from the object that was dropped</param>
        /// <returns></returns>
        IEnumerable<DropZoneBase> GetDropZones(object dropData);
        
        /// <summary>
        /// Provides a hook for when an IDragDropSource enters a dropzone associated with this IDragDropTarget
        /// </summary>
        /// <param name="dropZone"></param>
        void OnDragDropEnter(DropZoneBase dropZone);
        
        /// <summary>
        /// Provides a hook for when an IDragDropSource leaves a dropzone associated with this IDragDropTarget
        /// </summary>
        void OnDragDropLeave();

        /// <summary>
        /// Called when a IDragDropSource is dropped on the IDragDropTarget (in any defined drop zone {see 'GetDropZones() method'})
        /// </summary>
        /// <param name="dropZone">The dropzone object that the IDragDropSource dropped into</param>
        /// <param name="dropData">The data associated with the IDragDropSource.DragDropData.  Usually the IDragDropSource object itself.</param>
        void OnDrop(DropZoneBase dropZone, object dropData);

    }
}
